發現關於 Azure CLI 查詢、計算成本花費的網路中文文章好像沒有人寫,可能是2017年5月才推出的原因,所以筆者提供個人方式給讀者參考
關於成本花費情況,可以說是老闆最在乎的事情 (省錢應該,多花受罰,淚~)
Azure Portal 網頁版的成本分析功能其實已經做很好,能解大部分的需求,但有時需要客製
或是準確定位
意外花費情況,這時候可以使用 Azure CLI : az consumption usage ,其優點有 :
首先使用 az consumption usage -h 查看支援的功能,因為是 preview 版本
所以目前只支持 list
查詢功能。
sa@DESKTOP-WEI:~$ az consumption usage list - [tab][tab]
--billing-period-name --query -h
--debug --query-examples -m
--end-date --start-date -o
--help --subscription -p
--include-additional-properties --top -s
--include-meter-details --verbose -t
--only-show-errors -a
--output -e
這邊提供筆者會使用功能 :
--query
--subscription
查詢指定的訂閱--include-meter-details -m
可以顯示明細資料--start-date -s
、--end-date -e
篩選日期。舉例 :
$ az consumption usage list
Azure 會返回JSON陣列
的 UsageDetail 資料
[
{
"accountName": null,
"billableQuantity": "None",
"billingPeriodId": "/subscriptions/c905f1a3-b790-47cb-98f5-eb7b89d7d768/providers/Microsoft.Billing/billingPeriods/202010",
"consumedService": "Microsoft.Network",
"costCenter": null,
"currency": "USD",
"departmentName": null,
"id": "/subscriptions/c905f1a3-b790-47cb-98f5-eb7b89d7d768/providers/Microsoft.Billing/billingPeriods/202010/providers/Microsoft.Consumption/usageDetails/85b8a5ed-ccf7-1870-4ad2-dadd26be9f30",
"instanceId": "/subscriptions/c905f1a3-b790-47cb-98f5-eb7b89d7d768/resourceGroups/demo/providers/Microsoft.Network/publicIPAddresses/demoVMPublicIP",
"instanceLocation": "AP Southeast",
"instanceName": "demoVMPublicIP",
"invoiceId": null,
"isEstimated": true,
"meterId": "ae56b367-2708-4454-a3d9-2be7b2364ea1",
"name": "85b8a5ed-ccf7-1870-4ad2-dadd26be9f30",
"pretaxCost": "0",
"product": "",
"subscriptionGuid": "C905F1A3-B790-47CB-98F5-EB7B89D7D768",
"subscriptionName": "Free Trial",
"tags": null,
"type": "Microsoft.Consumption/usageDetails",
"usageEnd": "2020-09-30T23:59:59Z",
"usageQuantity": "8.6966666666000005392334060161374509334564208984375",
"usageStart": "2020-09-30T00:00:00Z"
}
]
加上 -m
顯示,會多出 meterDetails
屬性,可以知道藉由 meterCategory
知道屬於哪種服務類型
"meterDetails": {
"meterCategory": "Virtual Network",
"meterLocation": "AP Southeast",
"meterName": "Dynamic Public IP - Free",
"meterSubCategory": "IP Addresses",
"pretaxStandardRate": "None",
"serviceName": "Virtual Network",
"serviceTier": "IP Addresses",
"totalIncludedQuantity": "None",
"unit": ""
}
接著處理太多資料、屬性的問題
,像是筆者測試到目前才幾天,已經有204項明細
所以需要使用 --query
挑選出我們所要的資料。
az consumption usage list --query "[] | length(@)"
例子1 : 列出明細和需要欄位 : 名稱、服務類型、稅前費用、日期
az consumption usage list -m --query "[0].{name:instanceName,ser:consumedService,cat:meterDetails.meterCategory,pretaxCost:pretaxCost.to_number(@),date:usageStart}"
例子2 : 查詢10/2當天花費最高的前5名資源
邏輯 :
sort_by()[-5:]
取得正序倒數5筆
資料模擬倒序功能pretaxCost
預設是字串類型
,需要使用to_number(@)
轉型成數字# 推薦使用 -s -e 篩選日期
az consumption usage list -m -s "2020-10-02" -e "2020-10-02" --query "sort_by([],&pretaxCost.to_number(@))[-5:].{name:instanceName,ser:consumedService,cat:meterDetails.meterCategory,pretaxCost:pretaxCost.to_number(@),sDate:usageStart}" -o table
# 除非不行再使用 JMESPath 篩選日期
az consumption usage list -m --query "[?usageStart=='2020-10-02T00:00:00Z'] | sort_by([],&pretaxCost.to_number(@))[-5:].{name:instanceName,ser:consumedService,cat:meterDetails.meterCategory,pretaxCost:pretaxCost.to_number(@),sDate:usageStart}" -o table
例子3 : 篩選 app service 的花費明細並按照日期消費金額排序
az consumption usage list -m --query "[?meterDetails.meterCategory == 'Azure App Service'].{name:instanceName,ser:consumedService,cat:meterDetails.meterCategory,pretaxCost:pretaxCost.to_number(@),sDate:usageStart} | sort_by([],&pretaxCost.to_number(@))" -o table
例子4 : 篩選 app service 的花費總和
az consumption usage list -m --query "[?meterDetails.meterCategory == 'Azure App Service'].pretaxCost.to_number(@) | sum([]) "
例子5 : 總稅前花費成本
az consumption usage list -m --query "[].pretaxCost.to_number(@) | sum([])"
例子6 : 篩選掉 0 元花費資料
注意 : 要記得使用 "'" 否則系統會認不得返回以下錯誤訊息 :
ArgumentParseError: argument --query: invalid jmespath_type value: '[?pretaxCost.to_number(@) > ].{name:instanceName,ser:consumedService,cat:meterDetails.meterCategory,pretaxCost:pretaxCost.to_number(@),sDate:usageStart} | sort_by([],&pretaxCost)'
az consumption usage list -m --query "[?pretaxCost.to_number(@) > \`0\`].{name:instanceName,ser:consumedService,cat:meterDetails.meterCategory,pretaxCost:pretaxCost.to_number(@),sDate:usageStart} | sort_by([],&pretaxCost)" -o table
注意 :
假如沒有指定 -s 跟 -e 日期
,目前測試預設會過濾 15 天
以內資料
舉例 : 2020-10-08 查詢只會帶出 2020-09-20 ~ 2020-10-05 的資料